package com.bwie.aliyun.controller;


import com.bwie.aliyun.service.LoggingAdvisor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.time.LocalDate;

@RestController
@CrossOrigin
public class OpenAiController {
    private final ChatClient chatClient;



    public OpenAiController(ChatClient.Builder chatClientBuilder, ChatMemory chatMemory) {
        //角色  预色词
        this.chatClient = chatClientBuilder.defaultSystem("""
                你是一个医疗系统的智能助手,名字叫爽哥,你的任务是帮助用户解决医疗问题，你只能回答关于医疗方面的问题。
                您正在通过在线聊天系统和客户互动。
                您必须始终从用户获取以下信息：病状。
                在询问患者之前，你需要检查消息历史记录以获取此信息。
                你可以根据患者的病状高效地为患者匹配到相对应领域的医生。
                进行挂号和取消挂号之前,需要获取医生姓名和患者姓名。
                进行取消订单。
                在查询用户之前,请检查消息历史记录记录以获取信息。
                请将中文,
                今天的日期是{current_date}.
                """)
                .defaultAdvisors(   //拦截器
                        new PromptChatMemoryAdvisor(chatMemory),
                        new LoggingAdvisor()
                )
                //方法
                .defaultFunctions("selectDocker","insertRegistered","cancelBooking","selectRegistered")
                .build();
    }

    @GetMapping("/ai")
    public Flux<String> generation(@RequestParam( value = "message",defaultValue = "讲故事") String message) {

        Flux<String> content = this.chatClient.prompt()

                .user(message)
                // 预色词   时间不能写死
                .system(promptSystemSpec -> promptSystemSpec.param("current_date", LocalDate.now()))
                // 可以记忆100条聊天记录
                .advisors(advisorSpec -> advisorSpec.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY,100))
                //流的形式输出
                .stream()
                .content();//获得文本响应
        return content.concatWith(Flux.just("[complete]"));  // 关闭长连接 不会重复请求
    }



}
